const { ccclass, property } = cc._decorator;

import fruit from './fruit'

@ccclass
export default class NewClass extends cc.Component {

    @property(cc.Node)
    game_root: cc.Node = null

    @property(cc.Label)
    grade: cc.Label = null

    // 水果集，预制体
    @property(cc.Prefab)
    fruits: cc.Prefab[] = []

    // 当前新回合可以下落的水果
    current_fruit: cc.Node = null

    // 如果是新回合，则可以点击或滑动，如果不是，则不处理
    is_new_round: boolean = false

    // 能产生的最大的水果索引
    random_max: number = 0

    onLoad() {
        cc.director.getPhysicsManager().enabled = true
        cc.director.getPhysicsManager().debugDrawFlags = 0
        cc.director.getPhysicsManager().gravity = cc.v2(0, -320)
        cc.director.getCollisionManager().enabled = true
        cc.director.getCollisionManager().enabledDebugDraw = true

        this.game_root.on(cc.Node.EventType.TOUCH_START, (e) => {
            this.choose_position(e)
        }, this)
        this.game_root.on(cc.Node.EventType.TOUCH_MOVE, this.choose_position, this)
        this.game_root.on(cc.Node.EventType.TOUCH_END || cc.Node.EventType.TOUCH_CANCEL, this.drop, this)
    }

    start() {
        this.game_root.zIndex = 1
        this.new_round()
    }

    new_round() {
        let that = this
        let fruit = cc.instantiate(this.fruits[
            Math.floor(Math.random() * this.random_max)
        ])
        fruit.setPosition(cc.v2(0, 400))
        this.game_root.addChild(fruit)

        fruit.on('sameContact', ({ self, other }) => {
            // 两个node都会触发，临时处理，看看有没有其他方法只展示一次的
            other.node.off('sameContact')
            // 处理水果合并的逻辑，下面再处理
            that.onSameFruitContact(self, other)
        })

        this.current_fruit = fruit

        // 表示新回合
        this.is_new_round = true
    }

    // 水果下落
    drop(e) {
        if (this.is_new_round) {
            this.current_fruit.getComponent(fruit).drop()
            this.is_new_round = false
            setTimeout(() => {
                this.new_round()
            }, 1500)
        }
    }

    // 鼠标按下时移动位置
    choose_position(e) {
        if (this.current_fruit != null && this.is_new_round) {
            let postion = this.game_root.convertToWorldSpaceAR(this.current_fruit.position)
            postion.x = e.getLocationX()
            this.current_fruit.position = this.game_root.convertToNodeSpaceAR(postion)
        }
    }

    // 相同水果相撞
    onSameFruitContact(self, other) {
        let that = this
        // 获取水果名称中的索引
        let index = self.node.name.split("_")[1]
        index = Math.min(this.fruits.length - 1, index)

        //  销毁两个碰撞的水果
        self.node.removeFromParent(false)
        other.node.removeFromParent(false)

        // 产生新的水果
        let new_fruit = cc.instantiate(this.fruits[index])
        new_fruit.setPosition(other.node.getPosition())
        this.game_root.addChild(new_fruit)
        // 让新水果下落到底部
        new_fruit.getComponent(fruit).drop()

        // 新水果绑定碰撞事件
        new_fruit.on('sameContact', ({ self, other }) => {
            // 两个node都会触发，临时处理，看看有没有其他方法只展示一次的
            other.node.off('sameContact')
            // 处理水果合并的逻辑，下面再处理
            that.onSameFruitContact(self, other)
        })

        // 处理分数
        this.grade.string = Number(this.grade.string) + index

        // 处理产生最大水果的索引
        this.random_max = Math.max(this.random_max, index)
        if (this.random_max > this.fruits.length) {
            this.random_max = this.fruits.length
        }
    }

}
